package config

import (
	"errors"
	"log"
	"os"
	"sync"

	"local/common"

	"gopkg.in/ini.v1"
)

var Inst Config
var IsDevMode bool
var configMutex sync.RWMutex
var currentConfigFile string
var currentComments map[string]map[string]string

func InitConfig() error {
	configFilePath := "config.ini"
	if IsDevMode {
		configFilePath = "config.dev.ini"
	}
	currentConfigFile = configFilePath

	// 检查配置文件是否存在
	if _, err := os.Stat(configFilePath); os.IsNotExist(err) {
		// 配置文件不存在，创建并写入默认值
		cfg := defaultConfig()
		// 保存配置文件
		err = cfg.SaveTo(configFilePath)
		if err != nil {
			log.Fatalf("Failed to create config file: %v", err)
			return errors.New("配置文件写入失败，请检查后重新启动")
		}

		common.Info("配置文件已创建，请访问配置页面填写后重新启动")
	}

	// 加载配置文件
	cfg, err := ini.Load(configFilePath)
	if err != nil {
		log.Fatalf("Failed to read file: %v", err)
		return errors.New("配置文件加载失败，请检查后重新启动")
	}

	configMutex.Lock()
	defer configMutex.Unlock()

	// 解析注释
	currentComments = make(map[string]map[string]string)
	for _, section := range cfg.Sections() {
		sectionName := section.Name()
		if sectionName != "DEFAULT" {
			currentComments[sectionName] = make(map[string]string)
			for _, key := range section.Keys() {
				if key.Comment != "" {
					currentComments[sectionName][key.Name()] = key.Comment
				}
			}
		}
	}

	// 将配置文件映射到结构体
	err = cfg.MapTo(&Inst)
	if err != nil {
		log.Fatalf("Failed to map config: %v", err)
		return errors.New("配置文件解析失败，请检查后重新启动")
	}

	return nil
}

// GetConfig 返回当前配置的副本和注释
func GetConfig() ConfigResponse {
	configMutex.RLock()
	defer configMutex.RUnlock()
	return ConfigResponse{
		Inst:     Inst,
		Comments: currentComments,
	}
}

// UpdateConfig 更新配置并保存到文件
func UpdateConfig(newConfig Config) error {
	configMutex.Lock()
	defer configMutex.Unlock()

	// 加载现有配置文件
	cfg, err := ini.Load(currentConfigFile)
	if err != nil {
		return err
	}

	// 将新配置保存到文件
	err = cfg.ReflectFrom(&newConfig)
	if err != nil {
		return err
	}

	// 保存到文件（保留注释）
	err = cfg.SaveTo(currentConfigFile)
	if err != nil {
		return err
	}

	// 更新内存中的配置
	Inst = newConfig

	return nil
}
